package com.nhatth.contactsharer;

import java.util.Vector;

import android.app.Activity;
import android.app.ProgressDialog;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.support.v4.app.ListFragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Filter;
import android.widget.ListView;

public class ContactListFragment extends ListFragment implements Runnable{
	
	private ContactAdapter mAdapter;
	ProgressDialog pd;
	String TAG = "ContactListFragment";
	OnContactSelectedListener contactListener;
	ListView lv=null;
	final Handler handler = new Handler();
	
	//để báo cho MainActivity item duoc chon
	public interface OnContactSelectedListener {
		public void onContactSelected(Contact con);
		public Vector<Contact> getSelectedContact();
	}
	
	//khi được thêm vào activity
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		//cast vào OnContactListener để thực hiện trao đổi id
		try {
			contactListener = (MainActivity) activity;
		}
		catch (ClassCastException e) {
			throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
		}
	}
	
	//inflate custom layout
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.contact_list_fragment,container,false);
	}
	
	//Khởi tạo mọi thứ
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		Log.d(TAG, "onActivityCreated");
		//init adapter
		mAdapter = new ContactAdapter(getActivity(), android.R.layout.simple_list_item_multiple_choice);
		//đổ dữ liệu vào adapter
		bindData();
		//lấy listview
		lv = getListView();
		//Lấy textbox và tìm kiếm
		EditText txtSearch = (EditText) getActivity().findViewById(R.id.contact_list_fragment_txtSearch);
		mAdapter.getFilter().filter("");
		txtSearch.addTextChangedListener(new TextWatcher() {
			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
			}

			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			public void afterTextChanged(Editable s) {
				Log.d(TAG, "in filter");
				Filter f = mAdapter.getFilter();
				f.filter(s.toString(), new Filter.FilterListener() {
					
					//PHẢI ĐỂ FILTER XONG thì mới có thể xử lý dữ liệu trong adapter
					public void onFilterComplete(int count) {
						Log.d(TAG, "filter completed");
						for (int i = 0; i < mAdapter.getCount(); i++) {
							lv.setItemChecked(i, false);
						}
						for (Contact con : contactListener.getSelectedContact()) {
							ContactAdapter fAdapter = (ContactAdapter) getListAdapter();
							Log.d(TAG, "mAdapter.getCount(): "+fAdapter.getCount());
							Log.d(TAG, "Contact name:"+con.name+":"+con.checked+":"+fAdapter.getPosition(con));
							lv.setItemChecked(fAdapter.getPosition(con),true);
						}
					}
				});
			}
		});//hết phần tìm kiếm
	}
	
	//bỏ chọn tất cả các phần tử
	public void uncheckAll() {
//		if(mAdapter == null) {
//			mAdapter = new ContactAdapter(getActivity(), android.R.layout.simple_list_item_multiple_choice);;
//		}
		Log.d(TAG, "mAdapter="+(mAdapter == null));
		Log.d(TAG,"lv="+(lv==null));
		for (int i = 0; i < mAdapter.getCount(); i++) {
			Log.d(TAG, "uncheckAll.i="+i);
			lv.setItemChecked(i, false);
		}
	}
	
	//bỏ chọn một phần tử
	public void uncheck(Contact con) {
		Log.d(TAG, "mAdapter = "+mAdapter.toString());
		lv.setItemChecked(mAdapter.getPosition(con), false);
	}
	
	//khi chọn vào một phần tử
	@Override
	public void onListItemClick(ListView l, View v, int position, long id) {
		Contact con = (Contact) l.getItemAtPosition(position);
		if(con.checked) {
			con.checked = false;
		}
		else {
			con.checked = true;
		}
		mAdapter.notifyDataSetChanged();
		contactListener.onContactSelected(con);
	}
	
	//hàm đổ dữ liệu từ db
	private void bindData() {
		Log.d(TAG, "in bindData() method");
		Thread t = Thread.currentThread();
		Log.d(TAG, "in thread: "+t.getName());
		Thread bindThread = new Thread(this, "bindThread");
//		pd = ProgressDialog.show(getActivity(), "Please wait...", "Loading data from Contacts");
		bindThread.start();//Gọi một cái thread mới để đổ dữ liệu từ db vào ContactAdapter mAdapter
	}
	
	final Runnable dismissThread = new Runnable() {
		public void run() {
			finishBinding();
		}
	};

	//Vì class này implements Runnable để tạo ra 1 thread mới để lấy dữ liệu
	public void run() {
		//Cursor đến db
		Log.d(TAG, "bindThread.run()");
		Thread t = Thread.currentThread();
		Log.d(TAG, "in thread: "+t.getName());
		Cursor mCursor = getActivity().getContentResolver().query(
				ContactsContract.Contacts.CONTENT_URI,//URI của Contact để kết nói tới db
				new String[] { Contacts._ID, Contacts.DISPLAY_NAME },//Lấy ID và Name
				Contacts.HAS_PHONE_NUMBER + "=1", null, Contacts.DISPLAY_NAME + " Collate LOCALIZED");//Có số điện thoại và ORDER BY tên
		getActivity().startManagingCursor(mCursor); //Bắt đầu cho activity kiểm soát hoạt động của Cursor mCursor
		mAdapter.setCursor(mCursor);
		int displayName = mCursor.getColumnIndex(Contacts.DISPLAY_NAME);
		int id = mCursor.getColumnIndex(Contacts._ID);
		while(mCursor.moveToNext()){
			Contact con = new Contact(mCursor.getString(displayName), mCursor.getLong(id));
			mAdapter.add(con);
		}
		Log.d(TAG, "done loading data");
		setListAdapter(mAdapter);
		handler.post(dismissThread);
	}
	private void finishBinding() {
		pd = ((MainActivity) getActivity()).pd;
		pd.dismiss();
//		setListAdapter(mAdapter);
		Thread t = Thread.currentThread();
		Log.d(TAG, "in thread: "+t.getName());
		Log.d(TAG, "done binding data");
	}
}
